
from time import sleep

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait  # 用作显示等待：找元素的时候给点时间
from base.chrome_options import Options

"""
    基类: 工具类，将常用的/与项目适配的相关函数，进行二次封装，变成自定义内容，便于测试调用
    存在的意义就是为了让页面对象类进行继承，从而获得基本的方法来实现页面的操作流程
    getattr(class, name)()函数，从class对象中获取名称为name的成员属性
    如果要获取class对象的函数，则需要在末尾添加一个()
    getattr(webdriver, "Chrome") = webdriver.Chrome
    getattr(webdriver, "Chrome")() = webdriver.Chrome()
    如果传入的type_不是被允许或者错误的格式，browser函数会报错
"""
# 创建基类
class Base(object):
    # 构造函数
    def __init__(self, driver=webdriver.Chrome(options=Options().options_conf(), executable_path='../common/chromedriver.exe')):
        self.driver = driver

    # def browser(self, type_):
    #     driver = getattr(webdriver, type_)(options=Options().options_conf(), executable_path='../common/chromedriver.exe')
    #     return driver

    # 访问url
    def open(self, kwargs):
        self.driver.get(kwargs['txt'])
        self.driver.maximize_window()

    # 元素定位
    def locate(self, kwargs):
        """
        方法名：元素定位
        参数：
            loc:定位属性单元，例如：('xpath','//a[@xpath="ke"]')
            timeout:显示等待，默认10秒
        返回值：一个元素
        """
        return WebDriverWait(self.driver, 10).until(lambda s: s.find_element(kwargs['name'], kwargs['value']))

    # 元素定位s
    def locate_s(self, kwargs):
        """
            方法名：定位多个元素（当时实在没法精确定位使用）
            参数:
                loc:定位属性单元 例如： ('xpath','//a[@xpath="ke"]')
                timeout:显示等待，默认10秒
            返回值：
                多个元素
        """
        return WebDriverWait(self.driver, 10).until(lambda s: s.find_elements(kwargs['name'], kwargs['value']))

    # 键盘操作（例如日期键盘）
    def keys_input(self, kwargs):
        self.locate(kwargs).send_keys(Keys.CONTROL, 'a')  # 全选
        self.locate(kwargs).send_keys(kwargs['txt'])  # 输入值

    # 输入
    def input(self, kwargs):
        """
        输入
        :param loc:  输入框的定位
        :param txt: 输入的字符串
        :return:
        """
        self.locate(kwargs).clear()
        self.locate(kwargs).send_keys(kwargs['txt'])

    # 点击
    def click(self, kwargs):
        self.locate(kwargs).click()

    # 等待
    def wait(self, kwargs):
        sleep(kwargs['txt'])

    # 关闭
    def quit(self):
        self.driver.quit()

    # 最大化窗口
    def max_windows_(self):
        self.driver.maximize_window()

    # 跳转到最新的窗口
    def switch_to_windows_(self, kwargs):
        """
        跳转到指定窗口
        :param num: 窗口号s
        :return: 无
        """
        self.driver.switch_to.window(self.driver.window_handles[kwargs['txt']])

    def assert_text(self, kwargs):
        assert self.locate(kwargs).text == kwargs['expect'], "断言失败"

if __name__ == '__main__':
    base = Base()

